package org.apache.ibatis.common.type;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Name TypeHandler
 * @Description: 类型处理器 [接口]
 * 描述信息：该接口定义了进行数据处理必须实现的抽象方法。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-05-09 16:56:10
 **/
public interface TypeHandler<T> {

    /**
     * 向 PreparedStatement 对象中的指定变量位置写入一个值。
     *
     * @param ps        预执行语句
     * @param i         变量位置
     * @param parameter 变量值
     * @param jdbcType  JDBC 变量类型
     * @version v1.0.0
     * @author lichao
     * @date 2024-05-09 17:02:10
     */
    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

    /**
     * 从 ResultSet 结果集中按照字段名称读取一条数据。
     *
     * @param rs         结果集
     * @param columnName 字段名称
     * @return T 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-05-09 17:00:11
     */
    T getResult(ResultSet rs, String columnName) throws SQLException;

    /**
     * 从 ResultSet 结果集中按照字段编号读取一条数据。
     *
     * @param rs          结果集
     * @param columnIndex 字段编号
     * @return T 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-05-09 17:00:11
     */
    T getResult(ResultSet rs, int columnIndex) throws SQLException;

    /**
     * 从 CallableStatement 对象中按照字段编号读取一条数据。
     *
     * @param cs          回调语句
     * @param columnIndex 字段编号
     * @return T 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-05-09 17:00:11
     */
    T getResult(CallableStatement cs, int columnIndex) throws SQLException;

}
